package code2;

import java.util.Scanner;

public class Code {

    private String[][] arr = new String[16][16];
    private boolean flag = true; // 当flag=true时，白方落子；当flag=false时，黑方落子。
    private boolean b = true;    // 当b=true时，说明黑白方都还没有胜利，需要继续落子；当b=false时，说明有一方已经胜利。

    public Code() {

        for(int i=0;i<16;i++){
            for(int j=0;j<16;j++){
                arr[i][j] = "+";
            }
        }
    }

    //  绘制棋盘的方法
    public void huiZhiQiPan(){

        for(int i=0;i<=16;i++){
            for(int j=0;j<=16;j++){
                if(i==0){
                    if(j==0){
                        System.out.print("\t");
                    }else if(j>0&&j<11){
                        System.out.print((j-1)+"\t");
                    }else{
                        switch(j){
                            case 11:
                                System.out.print("a"+"\t"); break;
                            case 12:
                                System.out.print("b"+"\t"); break;
                            case 13:
                                System.out.print("c"+"\t"); break;
                            case 14:
                                System.out.print("d"+"\t"); break;
                            case 15:
                                System.out.print("e"+"\t"); break;
                            case 16:
                                System.out.println("f"+"\t");
                        }
                    }
                }else if(i>0&&i<11){
                    if(j==0){
                        System.out.print((i-1)+"\t");
                    }else{
                        if(j == 16){
                            System.out.println(arr[i-1][j-1]);
                        }else{
                            System.out.print(arr[i-1][j-1]+"\t");
                        }
                    }
                }else{
                    if(j==0){
                        switch(i){
                            case 11:
                                System.out.print("a"+"\t"); break;
                            case 12:
                                System.out.print("b"+"\t"); break;
                            case 13:
                                System.out.print("c"+"\t"); break;
                            case 14:
                                System.out.print("d"+"\t"); break;
                            case 15:
                                System.out.print("e"+"\t"); break;
                            case 16:
                                System.out.print("f"+"\t");
                        }
                    }else{
                        if(j == 16){
                            System.out.println(arr[i-1][j-1]);
                        }else{
                            System.out.print(arr[i-1][j-1]+"\t");
                        }
                    }
                }
            }
        }
    }

    // 双方落子的方法
    public void xiaQi(){

        Scanner input = new Scanner(System.in);
        while(b){
            if(flag == true){
                System.out.println("请白方落子：");
                int hang = input.nextInt();
                int lie = input.nextInt();
                if((hang<0 || hang >15) || (lie<0 || lie >15)){
                    System.out.println("落子在棋盘外，需要重新落子！");
                    continue;
                }
                if(arr[hang][lie]!="+"){
                    System.out.println("此处已有棋子，需要重新落子！");
                    continue;
                }
                arr[hang][lie] = "o"; // “o”表示是白方落的子
                huiZhiQiPan();
                show(hang, lie);
                flag = false;
            }else{
                System.out.println("请黑方落子：");
                int hang = input.nextInt();
                int lie = input.nextInt();
                if((hang<0 || hang >15) || (lie<0 || lie >15)){
                    System.out.println("落子在棋盘外，需要重新落子");
                    continue;
                }
                if(arr[hang][lie]!="+"){
                    System.out.println("此处已有棋子，需要重新落子！");
                    continue;
                }
                arr[hang][lie] = "*"; // “*”表示是黑方落的子
                huiZhiQiPan();
                show(hang, lie);
                flag = true;
            }

        }
    }

    // 判断是否有一方胜利的方法
    public void show(int hang, int lie){

        int num = 0;
        // 判断在一列中是否有五子相连
        for(int i=hang-3;i<=hang+4;i++){
            if(i == hang-3){
                if((i>=1&&i<16) && arr[i][lie] == arr[i-1][lie]){
                    num = 2;
                }else{
                    num = 0;
                }
            }else{
                if(i==1){
                    if(arr[i][lie] == arr[i-1][lie]){
                        num = 2;
                    }else{
                        num = 0;
                    }
                }else{
                    if((i>=1&&i<16) && arr[i][lie] == arr[i-1][lie]){
                        num += 1;
                        if(num == 5){
                            if(arr[i][lie]=="o"){
                                System.out.println("恭喜白方获胜！");
                                System.out.println("请重新开始。");
                                b = false;
                                return;
                            }else{
                                System.out.println("恭喜黑方获胜！");
                                System.out.println("请重新开始。");
                                b = false;
                                return;
                            }
                        }
                    }else{
                        num = 0;
                    }
                }

            }

        }
        num = 0;
        // 判断在一行中是否有五子相连
        for(int i=lie-3;i<=lie+4;i++){
            if(i == lie-3){
                if((i>=1&&i<16) && arr[hang][i] == arr[hang][i-1]){
                    num = 2;
                }else{
                    num = 0;
                }
            }else{
                if(i==1){
                    if(arr[hang][i] == arr[hang][i-1]){
                        num = 2;
                    }else{
                        num = 0;
                    }
                }else{
                    if((i>=1&&i<16) && arr[hang][i] == arr[hang][i-1]){
                        num += 1;
                        if(num == 5){
                            if(arr[hang][i]=="o"){
                                System.out.println("恭喜白方获胜！");
                                System.out.println("请重新开始。");
                                b = false;
                                return;
                            }else{
                                System.out.println("恭喜黑方获胜！");
                                System.out.println("请重新开始。");
                                b = false;
                                return;
                            }
                        }
                    }else{
                        num = 0;
                    }
                }
            }

        }
        num = 0;
        // 判断斜线上是否有五子相连
        for(int i=hang-3,j=lie-3;i<=hang+4&&j<=lie+4;i++,j++){
            if(i == hang-3){
                if((i>=1&&i<16) && (j>=1&&j<16) && arr[i][j] == arr[i-1][j-1]){
                    num = 2;
                }else{
                    num = 0;
                }
            }else{
                if(i==1 || j==1){
                    if((i>=1 && i<16) && (j>=1&&j<16) && arr[i][j] == arr[i-1][j-1]){
                        num = 2;
                    }else{
                        num = 0;
                    }
                }else {
                    if ((i>=1 && i<16) && (j>=1&&j<16) && arr[i][j] == arr[i-1][j-1]) {
                        num += 1;
                        if (num == 5) {
                            if (arr[i][j] == "o") {
                                System.out.println("恭喜白方获胜！");
                                System.out.println("请重新开始。");
                                b = false;
                                return;
                            } else {
                                System.out.println("恭喜黑方获胜！");
                                System.out.println("请重新开始。");
                                b = false;
                                return;
                            }
                        }
                    } else {
                        num = 0;
                    }
                }
            }

        }
        num = 0;
        // 判断在斜线上是否有五子相连
        for(int i=hang+3,j=lie-3;i>=hang-4&&j<=lie+4;i--,j++){
            if(i == hang+3){
                if((i>=0&&i<15) && (j>=1&&j<16) && arr[i][j] == arr[i+1][j-1]){
                    num = 2;
                }else{
                    num = 0;
                }
            }else{
                if(i==14 || j==1){
                    if((i>=0&&i<15) && (j>=1&&j<16) && arr[i][j] == arr[i+1][j-1]){
                        num = 2;
                    }else{
                        num = 0;
                    }
                }else{
                    if((i>=0&&i<15) && (j>=1&&j<16) && arr[i][j] == arr[i+1][j-1]){
                        num += 1;
                        if(num == 5){
                            if(arr[i][j]=="o"){
                                System.out.println("恭喜白方获胜！");
                                System.out.println("请重新开始。");
                                b = false;
                                return;
                            }else{
                                System.out.println("恭喜黑方获胜！");
                                System.out.println("请重新开始。");
                                b = false;
                                return;
                            }
                        }
                    }else{
                        num = 0;
                    }
                }
            }

        }
    }
}
